%     VIRTUAL HC - программа для получения эффективных свойств сотовых заполнителей
%     Copyright (C) 2018-2020  Михаил Козлов
%     Сайт проекта: <http://www.fastenerdoctor.ru/>
%     Адрес электронной почты для связи с разработчиком:
%     <doctor.fastener@gmail.com>
% 
%     Эта программа является свободным программным обеспечением: Вы можете
%     распространять ее и/или изменять, соблюдая условия Универсальной общественной
%     лицензии GNU, опубликованной Фондом свободного программного обеспечения,
%     либо редакции 3, либо (на Ваше усмотрение) любой редакции, выпущенной позже.
% 
%     Эта программа распространяется в надежде на то, что она окажется полезной,
%     но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ, включая даже подразумеваемую гарантию ТОВАРНОЙ ПРИГОДНОСТИ,
%     либо ПРИГОДНОСТИ ДЛЯ ОПРЕДЕЛЕННЫХ ЦЕЛЕЙ. Ознакомьтесь с Универсальной общественной
%     лицензией GNU для получения более подробной информации.
% 
%     Вы должны были получить копию Универсальной общественной лицензии GNU
%     вместе с этой программой. Если Вы ее не получили, то перейдите по адресу:
%     <http://www.gnu.org/licenses/>.
% 
%     This program is free software: you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation, either version 3 of the License, or
%     (at your option) any later version.
% 
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
%     GNU General Public License for more details.
% 
%     You should have received a copy of the GNU General Public License
%     along with this program.  If not, see <https://www.gnu.org/licenses/>.

function V_Cell = Cell_Volume_Fraction(RVE_Type, RVE_Frame_Points, RVE_Size, Cell_Mesh_Type, Foil_Thickness, Thickness_Model, Foil_density, HC_density)

global ErrCode;

V_Cell = [];

fprintf (1, 'Вычисление объемной доли стенок...                      ');

if (strcmp(Thickness_Model, 'FROM_DENSITY'))
    
    V_Cell = HC_density / Foil_density;
    
else
    
    switch Cell_Mesh_Type

        case 'SHELL'

            switch RVE_Type

                case 'TYPE_A'

                    Foil_Length = 4*norm(RVE_Frame_Points(5,:) - RVE_Frame_Points(6,:)) + ...
                                    2*norm(RVE_Frame_Points(2,:) - RVE_Frame_Points(3,:)) + ...
                                    4*norm(RVE_Frame_Points(2,:) - RVE_Frame_Points(6,:));

                    V_Cell = Foil_Length * Foil_Thickness / (RVE_Size(1) * RVE_Size(2));

                case 'TYPE_B'

                    Foil_Length = 4*norm(RVE_Frame_Points(5,:) - RVE_Frame_Points(6,:)) + ...
                                    2*norm(RVE_Frame_Points(2,:) - RVE_Frame_Points(3,:)) + ...
                                    4*norm(RVE_Frame_Points(2,:) - RVE_Frame_Points(6,:));

                    V_Cell = Foil_Length * Foil_Thickness / (RVE_Size(1) * RVE_Size(2));

                otherwise

                    fprintf (1, '\nОшибка функции Cell_Volume_Fraction: недопустимое значение параметра RVE_Type !\n');
                    ErrCode = -1;
                    return;

            end

        case 'SOLID'

            switch RVE_Type

                case 'TYPE_A'

                    Foil_Area = 4*(2*norm(RVE_Frame_Points(9,:) - RVE_Frame_Points(10,:)) * norm(RVE_Frame_Points(10,:) - RVE_Frame_Points(34,:)) + ...
                                       norm(RVE_Frame_Points(6,:) - RVE_Frame_Points(30,:)) * norm(RVE_Frame_Points(6,:) - RVE_Frame_Points(35,:)) + ...
                                     2*norm(RVE_Frame_Points(2,:) - RVE_Frame_Points(31,:)) * norm(RVE_Frame_Points(6,:) - RVE_Frame_Points(31,:)));

                    V_Cell = Foil_Area / (RVE_Size(1) * RVE_Size(2));

                case 'TYPE_B'

                    Foil_Area = 4*(2*norm(RVE_Frame_Points(1,:) - RVE_Frame_Points(6,:)) * norm(RVE_Frame_Points(6,:) - RVE_Frame_Points(7,:)) + ...
                                       norm(RVE_Frame_Points(7,:) - RVE_Frame_Points(31,:)) * norm(RVE_Frame_Points(7,:) - RVE_Frame_Points(35,:)) + ...
                                     2*norm(RVE_Frame_Points(2,:) - RVE_Frame_Points(30,:)) * norm(RVE_Frame_Points(7,:) - RVE_Frame_Points(30,:)));

                    V_Cell = Foil_Area / (RVE_Size(1) * RVE_Size(2));

                otherwise

                    fprintf (1, '\nОшибка функции Cell_Volume_Fraction: недопустимое значение параметра RVE_Type !\n');
                    ErrCode = -1;
                    return;

            end

        otherwise

            fprintf (1, '\nОшибка функции Cell_Volume_Fraction: недопустимое значение параметра Cell_Mesh_Type !\n');
            ErrCode = -1;
            return;

    end
    
end

fprintf (1, 'OK!\n');
